package com.atguigu02.project;
import java.util.Locale;
import java.util.Scanner;
public class CMUtility {
    private static Scanner sc = new Scanner(System.in);

    /**
     * 输入y/n，用于确认操作是否执行
     * @return Y获取N(小写的y或者n经过处理变成了大写)
     */
    public static char readConfirm() {
        char c = '0';
        while (true) {
            String str = readKeyBoard(1, false);
            c = str.toUpperCase(Locale.ROOT).charAt(0);
            if ( c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.println("输入有误（y/n）,请重新输入：");
            }
        }
        return c;
    }

    /**
     * 从键盘读入一个字符，用于菜单选择
     * @return 返回一个字符
     */
    public static char readSelection() {
        char c;
        while (true) {
            String str = readKeyBoard(1, false);
            c = str.charAt(0);
            if ( c != '1' && c != '2' && c != '3' && c != '4' && c != '5' ) {
                System.out.println("输入有误（1--5），请重新输入：");
            } else {
                break;
            }
        }
        return c;
    }

    /**
     * 从键盘读入最大长度为limit的字符串
     * 如果直接回车则返回defaultValue，否则返回从键盘读入的字符串
     * @param limit 最大长度限制
     * @param defaultValue 默认值
     * @return 返回字符串
     */
    public static String readString(int limit, String defaultValue ) {
        String str = readKeyBoard(limit, true);
        if ( str.equals("") ) {
            return defaultValue;
        }
        return str;
    }

    /**
     * 如果直接回车则返回default，否则从键盘读入一个字符
     * @param defaultValue
     * @return
     */
    public static char readChar( char defaultValue ) {
        String str = readKeyBoard(1, true);
        if ( str.equals("") ) {
            return defaultValue;
        }
        char c = str.charAt(0);
        return c;
    }

    /**
     * 如果直接回车，则返回defaultValue,否则最大输入长度限制为limit
     * @param limit 长度限制
     * @param defaultValue 默认值，如果直接回车，则返回该值
     * @return
     */
    public static int readInt(int limit, int defaultValue ) {
        int ans = 0;
        while (true) {
            String str = readKeyBoard(limit, true);
            if ( str.equals("") ) {
                return defaultValue;
            }
            try {
                ans = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e ) {
                System.out.println("数字输入错误，请重新输入：");
            }
        }
        return ans;
    }

    /**
     * 从键盘读取最大长度为limit的整数
     * 用于读入【年龄】
     * @param limit 最大长度限制
     * @return
     */
    public static int readInt(int limit) {
        int ans = 0;
        while (true) {
            String str = readKeyBoard(limit, false);
            try {
                ans = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e ) {
                System.out.println("数字输入错误，请重新输入：");
            }
        }
        return ans;
    }

    /**
     * 从键盘读入一个字符
     * 用于输入【性别】
     * @return
     */
    public static char readChar() {
        String str = readKeyBoard(1, false);
        char c = str.charAt(0);
        return c;
    }

    /**
     *从键盘读入最大长度为limit的字符串
     * 用于输入【电话号码，邮箱，姓名】
     * @param limit 从键盘读入的最大字符串长限制
     * @return 返回字符串
     */
    public static String readString(int limit ) {
        return readKeyBoard(limit, false);
    }

    /**
     * 私有方法，供本类中其他方法调用，不对外暴露
     * 用于从键盘读入长度不超过limit的字符串，value表示是否需要在输入为空时返回空字符串
     * @param limit 待输入的字符串长度最大限制
     * @param value 是否需要在输入为空时返回空字符串
     * @return 返回字符串
     */
    private static String readKeyBoard( int limit, boolean value ) {
        String line = "";
        while (sc.hasNextLine()) {
            line = sc.nextLine();
            if ( line.equals("")) {
                if (value) {return line;}
            }
            if ( line.length() < 1 || line.length() > limit ) {
                System.out.println("输入错误（不超过" + limit + "个字符），请重新输入：");
            } else {
                break;
            }
        }
        return line;
    }

}
